<template>
  <Table
    v-if="!!props.summaryFunc || props.summaryData"
    :showHeader="false"
    :bordered="false"
    :pagination="false"
    :dataSource="getDataSource"
    :rowKey="props.rowKey"
    :columns="getColumns"
    tableLayout="fixed"
    :scroll="props.scroll"
  />
</template>
<script lang="ts" setup>
import { unref, computed, toRaw } from "vue";
import { Table } from "ant-design-vue";
import { cloneDeep } from "lodash-es";
import { isFunction } from "@/utils/is";
import type { BasicColumn, BasicTableProps } from "../types/table";
import { INDEX_COLUMN_FLAG } from "../const";
import { useTableContext } from "../hooks/useTableContext";
import { ColumnType } from "ant-design-vue/es/table/interface";
import { parseRowKey } from "../helper";

defineOptions({ name: "BasicTableFooter" });

const props = withDefaults(
  defineProps<{
    summaryFunc?: Fn | null;
    summaryData?: Recordable[] | null;
    scroll?: BasicTableProps["scroll"];
    rowKey?: BasicTableProps["rowKey"];
  }>(),
  {
    summaryFunc: null,
    summaryData: null,
    rowKey: "",
  },
);

const SUMMARY_ROW_KEY = "_row";
const SUMMARY_INDEX_KEY = "_index";
const table = useTableContext();

const getDataSource = computed((): Recordable[] => {
  if (props.summaryData?.length) {
    props.summaryData.forEach((item, i) => {
      item[parseRowKey(props.rowKey, item)] = `${i}`;
    });
    return props.summaryData;
  }
  if (!isFunction(props.summaryFunc)) {
    return [];
  }
  let dataSource = toRaw(unref(table.getDataSource()));
  dataSource = props.summaryFunc(dataSource);
  dataSource.forEach((item, i) => {
    item[parseRowKey(props.rowKey, item)] = `${i}`;
  });
  return dataSource;
});

const getColumns = computed(() => {
  const dataSource = unref(getDataSource);
  const columns: BasicColumn[] = cloneDeep(table.getColumns());
  const index = columns.findIndex((item) => item.flag === INDEX_COLUMN_FLAG);
  const hasRowSummary = dataSource.some((item) =>
    Reflect.has(item, SUMMARY_ROW_KEY),
  );
  const hasIndexSummary = dataSource.some((item) =>
    Reflect.has(item, SUMMARY_INDEX_KEY),
  );

  if (index !== -1) {
    if (hasIndexSummary) {
      columns[index].customRender = ({ record }) => record[SUMMARY_INDEX_KEY];
      columns[index].ellipsis = false;
    } else {
      Reflect.deleteProperty(columns[index], "customRender");
    }
  }

  if (table.getRowSelection() && hasRowSummary) {
    const isFixed = columns.some((col) => col.fixed === "left");
    columns.unshift({
      width: 60,
      title: "selection",
      key: "selectionKey",
      align: "center",
      ...(isFixed ? { fixed: "left" } : {}),
      customRender: ({ record }) => record[SUMMARY_ROW_KEY],
    });
  }
  return columns as unknown as ColumnType[];
});
</script>
